package com.zj.wanandroid.ui.page.common

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.SnackbarHost
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.google.accompanist.insets.navigationBarsPadding
import com.google.accompanist.insets.statusBarsPadding
import com.google.accompanist.pager.ExperimentalPagerApi
import com.zj.wanandroid.data.bean.WebData
import com.zj.wanandroid.ui.page.login.LoginPage
import com.zj.wanandroid.ui.page.main.category.CategoryPage
import com.zj.wanandroid.ui.page.main.collect.CollectPage
import com.zj.wanandroid.ui.page.main.home.HomePage
import com.zj.wanandroid.ui.page.main.profile.ProfilePage
import com.zj.wanandroid.ui.page.search.SearchPage
import com.zj.wanandroid.ui.page.webview.WebViewPage
import com.zj.wanandroid.ui.widgets.AppSnackBar
import com.zj.wanandroid.ui.widgets.BottomNavBarView
import com.zj.wanandroid.utils.RouteUtils
import com.zj.wanandroid.utils.fromJson

@ExperimentalComposeUiApi
@ExperimentalFoundationApi
@ExperimentalPagerApi
@Composable
// 使用Jetpack Compose构建主应用框架
fun funAppScaffold() {
    // 1. 创建导航控制器（管理页面跳转）
    val navCtrl = rememberNavController()

    // 2. 获取当前导航堆栈的状态（用于动态更新UI）
    val navBackStackEntry by navCtrl.currentBackStackEntryAsState()
    val currentDestination = navBackStackEntry?.destination

    // 3. 管理Scaffold组件状态（包含SnackBar/抽屉等状态）
    val scaffoldState = rememberScaffoldState()

    // 4. 核心布局组件：包含状态栏/导航栏/内容区域/SnackBar
    Scaffold(
        modifier = Modifier
            .statusBarsPadding() // 自动适配系统状态栏高度
            .navigationBarsPadding(), // 自动适配导航栏高度

        // 底部导航栏配置（根据当前页面动态显示不同导航项）
        bottomBar = {
            when (currentDestination?.route) { // 根据当前路由名称动态切换
                RouteName.HOME -> BottomNavBarView(navCtrl = navCtrl)
                RouteName.CATEGORY -> BottomNavBarView(navCtrl = navCtrl)
                RouteName.COLLECTION -> BottomNavBarView(navCtrl = navCtrl)
                RouteName.PROFILE -> BottomNavBarView(navCtrl = navCtrl)
            }
        },

        // 主内容区域配置
        content = {
            // 定义导航宿主（包含所有页面路由）
            NavHost(
                modifier = Modifier.background(MaterialTheme.colors.background), // 设置背景颜色
                navController = navCtrl, // 绑定导航控制器
                startDestination = RouteName.HOME // 初始显示首页
            ) {
                // 5. 定义首页路由
                composable(route = RouteName.HOME) {
                    HomePage(navCtrl, scaffoldState) // 显示主页组件
                }

                // 6. 定义分类页面路由
                composable(route = RouteName.CATEGORY) {
                    CategoryPage(navCtrl) // 显示分类页组件
                }

                // 7. 定义收藏页面路由
                composable(route = RouteName.COLLECTION) {
                    CollectPage(navCtrl, scaffoldState) // 显示收藏页组件
                }

                // 8. 定义网页视图路由（带参数传递）
                composable(
                    route = RouteName.WEB_VIEW + "/{webData}", // 路由路径包含动态参数
                    arguments = listOf(navArgument("webData") { type = NavType.StringType }) // 参数类型声明
                ) {
                    // 解析路由参数并传递给页面组件
                    val args = it.arguments?.getString("webData")?.fromJson<WebData>()
                    if (args != null) {
                        WebViewPage(webData = args, navCtrl = navCtrl)
                    }
                }

                // 9. 定义登录页路由
                composable(route = RouteName.LOGIN) {
                    LoginPage(navCtrl, scaffoldState) // 显示登录页组件
                }

                // 10. 定义文章搜索页路由（带整数参数）
                composable(
                    route = RouteName.ARTICLE_SEARCH + "/{id}",
                    arguments = listOf(navArgument("id") { type = NavType.IntType })
                ) {
                    SearchPage(navCtrl, scaffoldState) // 显示搜索页组件
                }
            }
        },

        // 11. Snackbar消息显示区域
        snackbarHost = {
            SnackbarHost(
                hostState = scaffoldState.snackbarHostState // 绑定Scaffold状态
            ) { data ->
                println("actionLabel = ${data.actionLabel}") // 打印SnackBar操作按钮文本
                AppSnackBar(data = data) // 自定义SnackBar样式组件
            }
        }
    )
}